“Примерна” задача №8.
#include <iostream> using namespace std; #define M 100 typedef float ElementType; struct Queue { int f; //номер на фиктивен елемент //преди началото на опашката. int r; //номер на eлементa в края на опашката. ElementType QueueArray[M]; }; void enqueue(Queue *q, ElementType x) { if ((q->r + 1) % M == q->f) { cout << "StackOverflowException: " << "Index is greater than the maximum size!" << endl; exit(1); } q->r = (q->r + 1) % M; q->QueueArray[q->r] = x; } int main() { Queue queue; queue.f = 0; queue.r = 0; cout << queue.r << endl; for (int index = 0; index < M; index++) { enqueue(&queue, index); cout << queue.r << endl; } return 0; }
Output-а на програмата:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 StackOverflowException: Index is greater than the maximum size!
Забележка: Не забравяйте за кирилизацията.
Реалният фрагмент от код.
#include <iostream> using namespace std; #define M 100 typedef float ElementType; struct Queue { int f; //номер на фиктивен елемент //преди началото на опашката. int r; //номер на eлементa в края на опашката. ElementType QueueArray[M]; }; void enqueue(Queue *q, ElementType x) { if ((q->r + 1) % M == q->f) { cout << "ПРЕПЪЛВАНЕ" << endl; exit(1); } ... q->QueueArray[q->r] = x; } int main() { Queue queue; queue.f = 0; queue.r = 0; cout << queue.r << endl; for (int index = 0; index < M; index++) { enqueue(&queue, index); cout << queue.r << endl; } return 0; }
Обяснението на фрагмента от код и пропуските в него са:
Не се плашете от първия ред на фрагмента от код, но там дефинираме константа с име М и стойност 100, която ще служи за максимален размер на опашката.
Имаме структура Queue, която има данни, служещи за следене на началото и края на опашката. Масивът от числа с плаваща запетая е, за да пазим последователността от елементи, в него се записват самите стойностите на данните, които желаем да добавим в опашката, за разлика от променливите f и r.
Опашката е структура от данни, която добавя данните си отзад, а ги изтрива в обратен ред. Първият влязъл е първият излязъл.
Операциите за въвеждане и изваждане на елементи от него са: enqueue и dequeue.
Функцията enqueue:
Първата работа е да проверим дали можем да добавим елемент. По принцип същото нещо може да се ползва и от опашката, но ще спазим “добрата концепция” на Павлов. Ако се окаже, че остатъка от деление даде нулевия елемент, се извежда съобщение за грешка и програмата спира. Ако ли не увеличаваме индекса и след това се добавя конкретната стойност на този елемент.